



bool	WinInFocus = false;	//  ,      


bool	Leds[3] = {0, 0, 0}; //    
bool	PrevLeds[3] = {0, 0, 0}; //     
bool	SysLeds[3];			//      



//*********************************************************************************
//
//					   
//
//*********************************************************************************
void LedsTranslate(bool *Leds, bool *PLeds)
{
	bool b;

//-------------------------------------------------------------- NumLock
													
	if (Leds[0] ^ PLeds[0])										//     , 
	{

		keybd_event(VK_NUMLOCK, 0, KEYEVENTF_EXTENDEDKEY | 0, 0);				//    
		keybd_event(VK_NUMLOCK, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);	//
	}

//-------------------------------------------------------------- CapsLock

	if (Leds[1] ^ PLeds[1])										//     , 
	{

		keybd_event(VK_CAPITAL, 0, KEYEVENTF_EXTENDEDKEY | 0, 0);				//    
		keybd_event(VK_CAPITAL, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);	//
	}

//-------------------------------------------------------------- ScrollLock
												
	if (Leds[2] ^ PLeds[2])										//     , 
	{

		keybd_event(VK_SCROLL, 0, KEYEVENTF_EXTENDEDKEY | 0, 0);				//    
		keybd_event(VK_SCROLL, 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);	//
	}

}





//*********************************************************************************
//
//	          
//
//*********************************************************************************
void CopyLeds(bool *SLeds, bool *DLeds)
{
	DLeds[0] = SLeds[0];
	DLeds[1] = SLeds[1];
	DLeds[2] = SLeds[2];

}



//*********************************************************************************
//
//				     
//
//*********************************************************************************
void SaveLeds(bool *Leds)
{
	Leds[0] = bool(GetKeyState(VK_NUMLOCK) & 0x01);				// Leds[0] -  NumLock
	Leds[1] = bool(GetKeyState(VK_CAPITAL) & 0x01);				// Leds[1] -  CapsLock
	Leds[2] = bool(GetKeyState(VK_SCROLL) & 0x01);				// Leds[2] -  ScrollLock

}



//*********************************************************************************
//
//				     
//
//*********************************************************************************
void SaveLeds(bool *Leds)
{
	Leds[0] = bool(GetKeyState(VK_NUMLOCK) & 0x01);				// Leds[0] -  NumLock
	Leds[1] = bool(GetKeyState(VK_CAPITAL) & 0x01);				// Leds[1] -  CapsLock
	Leds[2] = bool(GetKeyState(VK_SCROLL) & 0x01);				// Leds[2] -  ScrollLock

}

//*********************************************************************************
//
//					   
//						  (   )
//
//*********************************************************************************
LRESULT CALLBACK KeyboardHook(int nCode, WPARAM wParam, LPARAM lParam)
{
	UINT8 vkCode, diCode, flags;
	KBDLLHOOKSTRUCT *lp = (KBDLLHOOKSTRUCT*)lParam;
	
//	printf("Hook action\n");

	if (WinInFocus)												//     
	{
		vkCode = UINT8(lp->vkCode);								//    
		flags = UINT8(lp->flags);								//  

		if ((nCode == HC_ACTION) &&								//     ,
			(flags & 0x10))										//    , 
																//       
			return CallNextHookEx(hhKeyboardHook, nCode, wParam, lParam);	


		if (nCode == HC_ACTION)									//     , 
		{
			if (flags & 0x01)									//      DirectInput
				diCode = HookScanTabDK[vkCode];					//   HookScanTab[],    
			else												// ,    HookScanTabDK[],
				diCode = HookScanTab[vkCode];					//     

//			printf("vkCode = 0x%02X, scanCode = 0x%02X, flags = 0x%02X, diCode = 0x%02X\n", vkCode, lp->scanCode, flags, diCode);

			HookKeyboard[diCode] = (flags ^ 0x80) & 0x80;		//   /  
																// 
			
			if ((vkCode == VK_CAPITAL) ||						//     CapsLock, 
				(vkCode == VK_NUMLOCK) ||						// NumLock  ScrollLock,   
				(vkCode == VK_SCROLL))							//    ( 
				return (1);										//  )
		}

	}

	return CallNextHookEx(hhKeyboardHook, nCode, wParam, lParam);
}



//*********************************************************************************
//
//					    
//
//*********************************************************************************
void WSetFocus(void)
{
//	printf("Set focus\n");
	
	if (WinInFocus)					//     ,  
		return;						//

	SaveLeds(SysLeds);				//     

	WinInFocus = true;				//   

	SaveLeds(PrevLeds);				//     
									// (     WinInFocus,
									// ..  ,     
									//     )

	LedsTranslate(Leds, PrevLeds);	//     
	CopyLeds(Leds, PrevLeds);		//    

}



//*********************************************************************************
//
//					  e  
//
//*********************************************************************************
void WKillFocus(void)
{
//	printf("Kill focus\n");

	LedsTranslate(SysLeds, Leds);	//      

	WinInFocus = false;				//   
}




//----------------------------------------------------------   Floppy-  

	Leds[0] = Floppy[0].Motor && Floppy[0].Mode;			//       ,
	Leds[1] = Floppy[1].Motor && Floppy[1].Mode;			//     


//   

	if (WinInFocus)
	{
		LedsTranslate(Leds, PrevLeds);
		CopyLeds(Leds, PrevLeds);
	}


